import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;

/**
 * 批量的压缩图片的脚本
 */
public class BatchImageCompressor {

    // 支持的图像格式
    private static final String[] SUPPORTED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".bmp"};

    public static void main(String[] args) {
        // 输入文件夹
        String inputDirPath = "C:\\Users\\Acer\\Desktop\\压缩";
        // 输出文件夹
        String outputDirPath = "C:\\Users\\Acer\\Desktop\\压缩好的";
        double quality = 0.05;  // 压缩质量，范围从 0.0 到 1.0

        compressImagesInDirectory(inputDirPath, outputDirPath, quality);
    }

    public static void compressImagesInDirectory(String inputDirPath, String outputDirPath, double quality) {
        File inputDir = new File(inputDirPath);
        File outputDir = new File(outputDirPath);

        if (!inputDir.isDirectory()) {
            System.out.println("输入路径不是一个目录。");
            return;
        }

        if (!outputDir.exists()) {
            outputDir.mkdirs(); // 创建输出目录
        }

        // 递归处理目录中的文件和子目录
        processDirectory(inputDir, outputDir, quality);
    }

    private static void processDirectory(File inputDir, File outputDir, double quality) {
        File[] files = inputDir.listFiles();
        if (files == null) {
            System.out.println("无法读取目录中的文件。");
            return;
        }

        for (File file : files) {
            if (file.isDirectory()) {
                // 处理子目录
                File newOutputDir = new File(outputDir, file.getName());
                if (!newOutputDir.exists()) {
                    newOutputDir.mkdirs(); // 创建子目录
                }
                processDirectory(file, newOutputDir, quality);
            } else if (file.isFile() && isSupportedImageFormat(file.getName())) {
                try {
                    String outputFilePath = outputDir.getPath() + File.separator + file.getName();
                    Thumbnails.of(file)
                            .size(1500, 1500)  // 设置图像的最大宽度和高度
                            .outputQuality(quality)  // 设置压缩质量，范围从 0.0 到 1.0
                            .toFile(outputFilePath);
                    System.out.println("已压缩 " + file.getName() + " 并保存到 " + outputFilePath);
                } catch (IOException e) {
                    System.err.println("压缩 " + file.getName() + " 失败: " + e.getMessage());
                }
            }
        }
    }

    // 检查文件扩展名是否是支持的图像格式
    private static boolean isSupportedImageFormat(String fileName) {
        for (String ext : SUPPORTED_EXTENSIONS) {
            if (fileName.toLowerCase().endsWith(ext)) {
                return true;
            }
        }
        return false;
    }
}
